package com.itheima.d5_map_traverse;

import java.util.HashMap;
import java.util.Map;
import java.util.function.BiConsumer;

/**
 * 目标：掌握Map集合的遍历方式三：Lambda
 *      JDK 1.8开始之后的新技术（非常的简单）
 */
public class MapTest3 {
    public static void main(String[] args) {
        //default void forEach(BiConsumer<? super K, ? super V> action) 结合lambda遍历Map集合
        Map<String, Double> map = new HashMap<>();
        map.put("蜘蛛精", 169.8);
        map.put("紫霞", 165.8);
        map.put("至尊宝", 169.5);
        map.put("牛魔王", 183.6);
        System.out.println(map);
        // map = {蜘蛛精=169.8, 牛魔王=183.6, 至尊宝=169.5, 紫霞=165.8}

      /*  map.forEach((k, v) -> {
            System.out.println(k + "--->" + v);
        });*/

        //上面lambda的原理：
        /*
        源码：
         foreach方法是需要一个BiConsumer类型的对象，但是BiConsumer是接口不能直接有对象，
            所以要用匿名内部类new一个出来,new出来BiConsumer对象后，会把该对象给foreach方法的action形参

        default void forEach(BiConsumer<? super K, ? super V> action) {
        Objects.requireNonNull(action);     //判断是否为空
        //这个增强for循环就是把“键值对“看成一个整体进行遍历：
        //这里是省略了this，原始是：this.entrySet(),把这个map集合转化为一个set集合的形式:Set<Map.Entry<k, v>> entrySet = map.entrySet();
        //这个set集合里面放的都是一些键值对的对象，也就是entry对象
        for (Map.Entry<K, V> entry : entrySet()) {
            K k;    //遍历到的键
            V v;    //遍历到的值
            try {
                k = entry.getKey();
                v = entry.getValue();
            } catch (IllegalStateException ise) {
                // this usually means the entry is no longer in the map.
                throw new ConcurrentModificationException(ise);
            }
            //action形参就是new的匿名内部类对象，调用accept方法，会调用匿名内部类中重写过的accept方法
            //后续每一次遍历entry对象，都会拿到每一对的键值对给重写过的accept方法
            action.accept(k, v);
        }
    }

       BiConsumer接口有函数式注解，所以可以lambda简化：
       @FunctionalInterface
       public interface BiConsumer<T, U> { void accept(T t, U u);  ..}

         */
        map.forEach(new BiConsumer<String, Double>() {
            @Override
            public void accept(String k, Double v) {
                System.out.println(k + "---->" + v);
            }
        });

        //上面简化后的结果：
        map.forEach((k, v) -> {
            System.out.println(k + "--->" + v);
        });


        System.out.println("----------------");
        //自己写一遍
        map.forEach((k,v) ->{
            System.out.println(k+":"+v);
        });
    }
}

